'''
**角色扮演一致性测试**

* 任务：创建提示词让AI扮演特定角色（如历史人物、职业角色）
* 挑战：测试角色在不同话题下的表现一致性
* 进阶：设计多角色对话场景
'''
import os
from datetime import datetime
from dotenv import load_dotenv
import requests

# 加载环境变量
load_dotenv()
# load_dotenv(r'绝对路径\cosplay.env')  # 如果加载环境有误则使用绝对路径

# 1.调用ds的api接口，连接ai
DEEPSEEK_API_URL="https://api.deepseek.com/v1/chat/completions"
DEEPSEEK_API_KEY=os.getenv("DEEPSEEK_API_KEY")
if not DEEPSEEK_API_KEY:
    raise ValueError("未找到DEEPSEEK_API_KEY，请检查.env文件或环境变量")
def generate_with_deepseek(messages,max_tokens=300):
    headers={
        "Authorization": f"Bearer {DEEPSEEK_API_KEY}",
        "Content-Type": "application/json"
    }
    payload={
        "model": "deepseek-chat",
        "messages":messages,
        "max_tokens": max_tokens,
        "temperature": 0.7
    }
    try:
        response = requests.post(DEEPSEEK_API_URL,headers=headers,json=payload)
        response.raise_for_status()
        # 提取AI回复内容
        return response.json()["choices"][0]["message"]["content"]
    except requests.exceptions.RequestException as e:
        print(f"API调用失败：{e}")  #错误处理
        return f'[API错误：{str(e)}]' #返回错误信息
    except (KeyError,ValueError) as e:
        print(f"响应解析错误：{e}")
        return f'[解析错误：{str(e)}]'
# 2.角色设定构建（生成角色扮演的系统提示词）
def create_cosplay_prompt(role_description):
#     创建系统提示词
    return f"""
    你现在需求完全扮演角色{role_description['name']}并和用户对话，具体角色设定如下：
    
    #角色设定
    -名字：{role_description['name']}
    -身份:{role_description['identity']}
    -性格：{role_description['personality']}
    -背景故事：{role_description['backstory']}
    -行为模式：{role_description['behavior']}
    对话风格：{role_description['speech_style']}
    
    #用户扮演角色
    {role_description['user_identity']}
    
    # 对话要求
    回答时需严格遵守以下规则：
    -时刻牢记‘角色设定’中的内容
    -回答时根据要求的‘输出格式’中的格式，一步步进行回复，严格根据格式中的要求进行回复
    
    """

# 3.测试话题生成（生成角色相关的测试问题）
def generate_test_topics(role_type):
#     根据角色类型生成测试话题
    base_topics=[
        '谈谈你的日常工作',
        '未来社会发展的趋势',
        '你对当前社会热点问题的看法',
        '你如何看待今年比以往任何时候都热',
        '分享一个你难忘的经历',
        '你如何看待科技进步'
    ]
    # 根据角色类型追加专属问题
    # 对于ai扮演的角色分成两种：历史人物，职业角色
    if role_type == "历史人物":
        return base_topics+['描述你所处时代的特点','你最重要的历史贡献是什么']
    elif role_type == "职业角色":
        return base_topics+['你工作中最大的挑战是什么','给想从事这个职业的人一些建议']
    else:
        return base_topics

# 使用标志变量控制清空操作
should_clear = False

# 4.一致性评估
# 评估AI回复的一致性
def evaluate_consistency(responses):
    print("\n===一致性评估===")
    for i in range(len(responses)-1):
        print(f'对比回答{i+1}和{i+2}:')
        # 简单检查内容连贯性
        print("主题连贯性：","高" if responses[i][:300] in responses[i+1:] else "中")
        print("角色特征保持：","是" if '我' in responses[i+1] else "否" )

#保存结果到文件
def save_to_file(role_name, responses, test_topics,filename='人物测试结果.txt'):
    # 将内容保存到文件
    try:
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        # 构建本次运行的完整内容
        content = f"=== {role_name} 测试结果 ===\n"
        content += f"生成时间: {timestamp}\n\n"

        # 添加所有回答内容
        for i, response in enumerate(responses, 1):
            content += f"【话题 {i}：{test_topics[i-1]}】\n{response}\n"
            content += "-" * 50 + "\n\n"

        # 添加一致性评估
        content += "=== 一致性评估 ===\n"
        for i in range(len(responses) - 1):
            content += f"对比回答 {i + 1} 和 {i + 2}:\n"
            content += f"主题连贯性: {'高' if responses[i][:50] in responses[i + 1] else '中'}\n"
            content += f"角色特征保持: {'是' if '我' in responses[i + 1] else '否'}\n\n"

        # 检查文件是否存在且有内容
        global should_clear
        if should_clear == False:
            with open(filename, 'w', encoding='utf-8') as f:
                f.write('')
                print(f"检测到非空文件 {filename}，已清空")
                should_clear = True

        # 写入本次全部内容（'w'模式会自动创建/覆盖文件）
        with open(filename, 'a', encoding='utf-8') as f:
            f.write(content)

        print(f"本次测试结果已完整保存到文件: {filename}")

    except Exception as e:
        print(f"保存文件时出错: {e}")



# 5.主测试流程（执行角色扮演测试；打印部分内容）
# 执行完整测试流程
def role_playing_test(role_description,test_times=3):
    # 1.生成角色提示词
    system_prompt=create_cosplay_prompt(role_description)
    # 2.获取测试问题
    test_topics=generate_test_topics(role_description.get("type"," "))
    responses=[]
    print(f"\n====开始测试{role_description['name']}====")
    # 3.执行多轮测试
    for i in range(min(test_times,len(test_topics))):
        print(f"\n话题{i+1}：{test_topics[i]}")
        messages=[
            {'role':'system','content':system_prompt},
            {'role':'user','content':test_topics[i]},
        ]
        # 获取AI回复
        response=generate_with_deepseek(messages)
        if response:
            print(f"回答：{response[:300]}") #打印全部内容
            responses.append(response)
    # 4.评估一致性
    evaluate_consistency(responses)
    save_to_file(role_description["name"],responses,test_topics)
    return responses


# 6.示例角色测试（定义测试角色；执行测试）
if __name__=="__main__":
    # 定义测试角色
    historical_character={
        'name':'诸葛亮',
        'identity':'三国时期蜀汉丞相',
        'type':'历史人物',
        'personality':'智慧过人、忠心耿耿、谨慎细致',
        'backstory':'字孔明，号卧龙，辅佐刘备建立蜀汉政权',
        'behavior':'-习惯引经据典\n- 常用战略思维分析问题\n-说话文雅有礼',
        'speech_style':'使用文言文和白话文结合的方式，常引用《春秋》《孙子兵法》',
        'user_identity':'刘备帐下将领',
    }
    professional_role={
        'name':'AI研究员',
        'identity':'顶尖科技公司首席AI科学家',
        'type':'职业角色',
        'personality':'理性客观、富有创新精神',
        'backstory':'在MIT获得博士学位，发表过100+篇论文',
        'behavior':'- 用数据支撑观点\n- 关注技术伦理\n- 喜欢用比喻解释复杂概念',
        'speech_style':'专业但不晦涩，常使用技术术语但会解释',
        'user_identity':'科技记者',
    }
    # 执行测试
    print('======历史人物测试=======')
    zhugeliang_responses=role_playing_test(historical_character)

    print('\n======职业角色测试=======')
    ai_responses=role_playing_test(professional_role)

